import numpy as np

###三层神经网络，其组成为：输入层、第一层、第二层、输出层；明明是四个层，为什么称之为三层神经网络呢？因为其权重求和只出现了三次


##一般层的激活函数
def sigmoid(x):
    return 1/(1+np.exp(-x))

##输出层的激活函数
def identity_function(x):
    return x

##初始化神经网络的参数
def init_network():
    network = {}
    network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])  #设置输入层到第一层的权重
    network['b1'] = np.array([0.1,0.2,0.3])  #设置输入层到第一层的偏置值
    network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])  #设置第一层到第二层的权重
    network['b2'] = np.array([0.1,0.2])   #设置第一层到第二层的偏置
    network['W3'] = np.array([[0.1,0.3],[0.2,0.4]])  #设置第二层到输出层的权重
    network['b3'] = np.array([0.1,0.2])  #设置第二层到输出层的偏置
    return network  #返回这个初始化好了的数据

##具体的神经流转过程
def forward(network, x):
    W1,W2,W3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    a1 = np.dot(x,W1) +b1  #计算第一层的到的权重总和（包含偏置）
    z1 = sigmoid(a1)  #通过激活函数实现权重总和到第一层输出的转换
    a2 = np.dot(z1,W2) + b2  #计算第二层得到的权重总和（包含偏置）
    z2 = sigmoid(a2)  #通过激活函数实现权重总和到第二层输出的转换
    a3 = np.dot(z2,W3) + b3  #计算输出层得到的权重总和（包含偏置）
    y = identity_function(a3)  #通过输出层的激活函数实现输出层得到的权重到输出的转换
    return y

if __name__ == '__main__':
    network = init_network()  #初始化各层权重、偏置
    x = np.array([1.0,0.5])  #定义输入的具体数值
    y = forward(network,x)  #通过神经网络运算得到输出
    print(y)  #[0.31682708  069627909]
